千万别惹程序员!!揭露马蜂窝85%数据造假!他们仨是如何做到的?
就在这两天,马蜂窝的数据造假事件轰轰烈烈,85%的UGC数据都是抄袭和搬运而来的,全网都在讨论这件事:
▏估值175亿的旅游独角兽,是一座僵尸和水军构成的鬼城?
整件事是由三个海归程序员点外卖引起的。他们仨因为吃外卖拉肚子,去投诉,才发现了整件事有猫腻,于是,一挖就是三个月!我想说,千万别惹程序员,他们要是挖起来,可就不是蛛丝马迹了,而是……
100000000000000000000000条蛛丝……
1000000000000000000000000个马迹……
以下是他们发布的文章,文章后半部分我们邀请了老师从专业角度分析,这件事他们是咋实现的:
我们偶然注意到
马蜂窝点评增长趋势非常诡异
点评的数量,在特定时间节点指数级上升
随后断崖式回落
我们怀疑,这几个节点和融资有关系。
然后我们去翻点评,发现了很多自相矛盾的奇怪现象
因此我们决定抓取大众点评、艺龙、携程
等竞品网站内容,并进行对比
结论让我们震惊
马蜂窝的抄袭,超出了我们的想象
就拿餐饮来说
我们抓取了马蜂窝上116万家餐厅
并抽取了三分之一的样本
然后定了一个非常严格的“抄袭“标准
一字不差的抄袭,才算抄袭
十句话有一句不同,就不算抄袭
以这个为抄袭标准
同时,以抄袭150个不同的大众点评账户
为”抄袭账号“标准
好了,请你深吸一口气
然后看接下来的内容
尽管我们已经把标准定的如此严格。
我们还是在马蜂窝上,
发现了7454个抄袭账号
平均每个人从携程、艺龙、美团、Agoda、Yelp上
抄袭搬运了数千条点评
合计抄袭572万条餐饮点评
1221万条酒店点评
占到他们官网声称总点评数的85%
他们的壮举我们看完了,我们现在也邀请到老师初步分析,如果想要做这样一项工作,实现原理是怎样的?一起来看看吧~
完成这项工作,主要涉及到两方面工作:
1、通过爬虫框架爬取马蜂窝及竞品的网站信息。
2、通过机器学习结合数据分析,计算相似度。
爬取数据,在python里要用框架来实现,使用框架,可以高效的实现大量数据的爬取,比较推荐的就是Scrapy爬虫框架。下面给大家推荐一些常用的python爬虫框架,都是很实用、强大的。
常见的Python爬虫框架
(1)Scrapy:很强大的爬虫框架,可以满足简单的页面爬取(比如可以明确获知url pattern的情况)。用这个框架可以轻松爬下来如亚马逊商品信息之类的数据。但是对于稍微复杂一点的页面,如weibo的页面信息,这个框架就满足不了需求了。
(2)Crawley: 高速爬取对应网站的内容,支持关系和非关系数据库,数据可以导出为JSON、XML等
(3)Portia:可视化爬取网页内容
(4)newspaper:提取新闻、文章以及内容分析
(5)python-goose:java写的文章提取工具
(6)Beautiful Soup:名气大,整合了一些常用爬虫需求。缺点:不能加载JS。
(7)mechanize:优点:可以加载JS。缺点:文档严重缺失。不过通过官方的example以及人肉尝试的方法,还是勉强能用的。
(8)selenium:这是一个调用浏览器的driver,通过这个库你可以直接调用浏览器完成某些操作,比如输入验证码。
(9)cola:一个分布式爬虫框架。项目整体设计有点糟,模块间耦合度较高。
数据已经爬取出来了,那么怎么做相似度的计算呢?
常用的相似度计算方法原理及实现
在数据分析和数据挖掘以及搜索引擎中,我们经常需要知道个体间差异的大小,进而评价个体的相似性和类别。常见的比如数据分析中比如相关分析,数据挖掘中的分类聚类(K-Means等)算法,搜索引擎进行物品推荐时。
相似度就是比较两个事物的相似性。一般通过计算事物的特征之间的距离,如果距离小,那么相似度大;如果距离大,那么相似度小。比如两种水果,将从颜色,大小,维生素含量等特征进行比较相似性。
问题定义:有两个对象X,Y,都包含N维特征,X=(x1,x2,x3,……..,xn),Y=(y1,y2,y3,……..,yn),计算X和Y的相似性。常用的有五种方法,如下。
1、欧几里得距离(Eucledian Distance)
欧氏距离是最常用的距离计算公式,衡量的是多维空间中各个点之间的绝对距离,当数据很稠密并且连续时,这是一种很好的计算方式。
因为计算是基于各维度特征的绝对数值,所以欧氏度量需要保证各维度指标在相同的刻度级别,比如对身高(cm)和体重(kg)两个单位不同的指标使用欧式距离可能使结果失效。
代码:
2、曼哈顿距离(Manhattan Distance)
Manhattan distance = |x1 – x2| + |y1 – y2|,p1 at (x1, y1) and p2 at (x2, y2).
代码:
3、明可夫斯基距离(Minkowski distance)
明氏距离是欧氏距离的推广,是对多个距离度量公式的概括性的表述,看看下图
公式:
从公式我们可以看出,
当p==1,“明可夫斯基距离”变成“曼哈顿距离”
当p==2,“明可夫斯基距离”变成“欧几里得距离”
当p==∞,“明可夫斯基距离”变成“切比雪夫距离”
代码:
4、(余弦相似度)Cosine Similarity
余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上。
代码:
5、Jaccard Similarity
Jaccard系数主要用于计算符号度量或布尔值度量的个体间的相似度,因为个体的特征属性都是由符号度量或者布尔值标识,因此无法衡量差异具 体值的大小,只能获得“是否相同”这个结果,所以Jaccard系数只关心个体间共同具有的特征是否一致这个问题。
对于上面两个对象A和B,我们用Jaccard计算它的相似性,公式如下
首先计算出A和B的交(A ∩ B),以及A和B的并 (A ∪ B):
然后利用公式进行计算:
代码:
六、皮尔森相关系数(Pearson Correlation Coefficient)
又称相关相似性,通过Peason相关系数来度量两个用户的相似性。计算时,首先找到两个用户共同评分过的项目集,然后计算这两个向量的相关系数。
公式:
实现汇总:
最后想说,每一个程序员都有爆发的无限可能,社会上的广大人群,请务必做个好人,要不然哪天,就会被伟大而正义的格子衫小哥哥小姐姐们,深度挖掘!
如果你也想学习python爬虫,这里推荐你大咖老师讲解的Python爬虫入门必学课,4小时学会爬虫原理+实战,以后就可以独立爬取各大网站了,快跟老师一起爬取猫眼电影吧。报名还可获得10G学习资料!(还有老师社群答疑服务+定期直播分享哦)
推荐阅读
会这133个Java面试题进阿里还是问题吗?测测你会几个!(内含答案解析)